import os
from dotenv import load_dotenv
from langchain_community.document_loaders import PyPDFLoader, TextLoader

# -- coding: utf-8 --
import sys
import io
from dotenv import load_dotenv

# 设置标准输出的编码为UTF-8
if sys.stdout.encoding != "UTF-8":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")

# 加载环境变量
load_dotenv()


def text_loader_demo():
    """文本文件加载演示"""
    print("\n📝 文本文件加载演示")
    print("-" * 40)

    # 创建一个示例文本文件
    sample_text = """人工智能(AI)是计算机科学的一个分支，它企图了解智能的实质，并生产出一种新的能以人类智能相似的方式做出反应的智能机器。

机器学习是人工智能的一个子集，它使用统计技术让计算机系统能够从数据中"学习"，而无需进行明确的编程。

深度学习是机器学习的一个特定子领域，它使用具有多个层级的神经网络来模拟人脑的学习过程。"""

    text_path = "documents/sample.txt"
    os.makedirs("documents", exist_ok=True)

    # 写入示例文本
    with open(text_path, "w", encoding="utf-8") as f:
        f.write(sample_text)

    try:
        # 加载文本文件
        loader = TextLoader(text_path, encoding="utf-8")
        documents = loader.load()

        print(f"✅ 成功加载文本文件")
        print(f"📊 文档数量: {len(documents)}")

        if documents:
            doc = documents[0]
            print(f"\n📖 文档内容:")
            print(f"   内容长度: {len(doc.page_content)} 字符")
            print(f"   元数据: {doc.metadata}")
            print(f"   内容: {doc.page_content}")

        return documents

    except Exception as e:
        print(f"❌ 文本加载失败: {e}")
        return None


def create_sample_documents():
    """创建示例文档"""
    print("\n📁 创建示例文档")
    print("-" * 40)

    os.makedirs("documents", exist_ok=True)

    # 创建详细的示例文本
    sample_content = """
人工智能技术概述

1. 机器学习
机器学习是人工智能的核心技术之一，它使计算机系统能够从数据中学习和改进，而无需进行明确的编程。主要类型包括：
- 监督学习：使用标记数据训练模型
- 无监督学习：在未标记数据中发现模式
- 强化学习：通过试错学习最优策略

2. 深度学习
深度学习是机器学习的一个分支，使用多层神经网络来处理复杂模式。应用包括：
- 计算机视觉：图像识别、目标检测
- 自然语言处理：文本分类、机器翻译
- 语音识别：语音转文本、语音合成

3. 大语言模型(LLM)
大语言模型是基于Transformer架构的深度学习模型，能够理解和生成人类语言。特点包括：
- 上下文理解能力
- 多任务处理能力
- 创造性文本生成

4. RAG技术
检索增强生成(RAG)结合了信息检索和文本生成，通过从外部知识库检索相关信息来增强LLM的回答准确性。
"""

    # 写入示例文件
    with open("documents/ai_technology.txt", "w", encoding="utf-8") as f:
        f.write(sample_content)

    print("✅ 已创建示例文档: documents/ai_technology.txt")
    return "documents/ai_technology.txt"


def pdf_loader_analysis():
    """PDF加载和分析演示"""
    print("\n📄 PDF文档加载分析")
    print("-" * 40)

    pdf_path = "documents/sample.pdf"
    if not os.path.exists(pdf_path):
        print(f"❌ 请先在 {pdf_path} 放置一个PDF文件")
        print(f"💡 你可以从网上下载一个可搜索的PDF文件进行测试")
        return None

    try:
        # 加载PDF文档
        loader = PyPDFLoader(pdf_path)
        documents = loader.load()

        print(f"✅ 成功加载PDF文档")
        print(f"📊 文档页数: {len(documents)}")

        # 分析PDF内容
        total_chars = sum(len(doc.page_content.strip()) for doc in documents)
        print(f"📈 总字符数: {total_chars}")

        # 判断PDF类型并给出建议
        if total_chars < 100:  # 这里有个bug,我测试文件只有几个汉字也归到这里了。
            print("\n🔍 分析结果: 扫描版图片PDF")
            print("❓ 问题: 只能提取到少量文字（扫描软件标识）")
            print("💡 解决方案:")
            print("   1. 安装OCR工具:")
            print("      pip install pdf2image pytesseract pillow")
            print("      并安装 Tesseract OCR 程序")
            print("   2. 安装PyMuPDF:")
            print("      pip install pymupdf")
            print("   3. 获取可搜索文本版本的PDF文件")
        else:
            print("\n🔍 分析结果: 可搜索文本PDF")
            print("✅ 可以直接提取文字内容")

        # 显示每页内容预览
        print(f"\n📖 页面内容预览:")
        for i, doc in enumerate(documents):
            content = doc.page_content.strip()
            if content:
                preview = content[:150] + "..." if len(content) > 150 else content
                print(f"   第{i+1}页: {preview}")
            else:
                print(f"   第{i+1}页: [空或无法提取文字]")

        return documents

    except Exception as e:
        print(f"❌ PDF加载失败: {e}")
        return None


def check_for_searchable_pdfs():
    """检查是否有其他可搜索的PDF文件"""
    print("\n🔎 检查其他PDF文件")
    print("-" * 40)

    searchable_pdfs = []

    # 检查documents文件夹中的所有PDF文件
    for filename in os.listdir("documents"):
        if filename.lower().endswith(".pdf"):
            filepath = os.path.join("documents", filename)
            if filename != "sample.pdf":  # 跳过我们已经分析过的sample.pdf
                try:
                    loader = PyPDFLoader(filepath)
                    docs = loader.load()
                    total_chars = sum(len(doc.page_content.strip()) for doc in docs)

                    if total_chars > 100:  # 如果字符数较多，认为是可搜索PDF
                        searchable_pdfs.append((filename, total_chars))
                        print(f"✅ 发现可搜索PDF: {filename} (字符数: {total_chars})")

                        # 显示第一页预览
                        if docs and docs[0].page_content.strip():
                            preview = docs[0].page_content.strip()[:200]
                            print(f"   内容预览: {preview}...")
                    else:
                        print(f"ℹ️  扫描版PDF: {filename} (字符数: {total_chars})")

                except Exception as e:
                    print(f"❌ 无法分析 {filename}: {e}")

    if not searchable_pdfs:
        print("ℹ️  未发现其他可搜索PDF文件")
        print("💡 你可以从以下来源获取可搜索PDF进行测试:")
        print("   - 官方网站的技术文档")
        print("   - 学术论文PDF")
        print("   - 电子书")

    return searchable_pdfs


def create_simple_text_pdf_alternative():
    """创建简单的文本文件作为PDF替代品"""
    print("\n📄 创建PDF替代演示文件")
    print("-" * 40)

    # 创建一个详细的文本文件，模拟PDF内容结构
    pdf_like_content = """PDF文档结构示例

标题: 人工智能技术白皮书
作者: 技术研究团队
日期: 2024年1月

第一章: 引言
人工智能正在改变世界。从语音助手到自动驾驶，AI技术已经深入到我们生活的方方面面。

第二章: 核心技术
1. 机器学习
   - 监督学习
   - 无监督学习 
   - 强化学习

2. 深度学习
   - 神经网络
   - 卷积神经网络(CNN)
   - 循环神经网络(RNN)

3. 自然语言处理
   - 文本分类
   - 情感分析
   - 机器翻译

第三章: 应用场景
- 智能客服
- 医疗诊断
- 金融风控
- 教育个性化

第四章: 未来展望
人工智能将继续发展，带来更多创新应用。

结语
这份文档展示了可搜索PDF的典型内容结构。在实际的可搜索PDF中，这些文字可以直接被提取和处理。
"""

    alt_path = "documents/pdf_alternative.txt"
    with open(alt_path, "w", encoding="utf-8") as f:
        f.write(pdf_like_content)

    print(f"✅ 已创建PDF替代文件: {alt_path}")

    # 加载这个文件来演示
    try:
        loader = TextLoader(alt_path, encoding="utf-8")
        documents = loader.load()

        if documents:
            doc = documents[0]
            print(f"📊 内容长度: {len(doc.page_content)} 字符")
            print(f"📖 内容预览: {doc.page_content[:200]}...")

        return documents
    except Exception as e:
        print(f"❌ 加载替代文件失败: {e}")
        return None


def clear_console():
    """清空控制台"""
    os.system("cls" if os.name == "nt" else clear)


if __name__ == "__main__":
    # 清空控制台以避免重复输出
    clear_console()

    print("🎯 Day 4 - 文档加载器学习")
    print("=" * 50)

    # 创建示例文档
    sample_file = create_sample_documents()

    # 演示文本加载
    text_docs = text_loader_demo()

    # 分析PDF类型
    pdf_type = pdf_loader_analysis()

    # 检查其他PDF文件
    other_pdfs = check_for_searchable_pdfs()

    # 如果没有可搜索PDF，创建替代文件
    if not other_pdfs:
        alt_docs = create_simple_text_pdf_alternative()

    print("\n" + "=" * 50)
    print("🎉 文档加载学习完成！")
    print("\n📚 学习总结:")
    print("   ✅ 文本文件加载: 完全掌握")
    print("   ✅ PDF类型识别: 成功区分扫描版和可搜索版")
    print("   ✅ 问题诊断: 能够识别扫描PDF的限制")
    print("   ✅ 解决方案: 了解处理扫描PDF的方法")

    print("\n🔧 技术要点:")
    print("   1. TextLoader - 用于加载文本文件")
    print("   2. PyPDFLoader - 用于加载PDF文件")
    print("   3. 扫描PDF vs 可搜索PDF - 重要概念")
    print("   4. OCR技术 - 处理扫描PDF的解决方案")

    print("\n🚀 下一步建议:")
    print("   1. 找一些可搜索PDF文件进行实践")
    print("   2. 如需处理扫描PDF，安装OCR工具")
    print("   3. 继续学习文档分割和向量化")
